/*
 * main.c
 *
 *  Created on: Nov 26, 2008
 *      Author: marco
 */

#include <stdio.h>
#include "list.h"


void print(list l);

static void aux_print(list p);

void print(list ll) {
	if (ll == NULL) {
		printf("Lista vuota \n");
		return;
	}
	else {
		printf("Lista <-->  %d", val(ll));
		aux_print(next(ll));
		putchar('\n');
	}

}

static void aux_print(list ll) {
	if (ll == NULL)
		return;
	else {
		printf("  -> %d", val(ll));
			aux_print(next(ll));
	}
}



int add_six (int x) {
	return x + 6;
}

int square (int x) {
	return x*x;
}

int add (int x, int y) {
    return x + y;

}

int mul (int x, int y) {
    return x * y;
}

static void del_list(list l) { // da rifare iterativa
	if (l!=NULL) {
		del_list(l->next);
		l->next = NULL;
		free_node(l);
	}
}

int main (void) {
	list ll = NULL, vv,tt;              /* liste di prova */
	list node;                   /* lista di un nodo */
	int v[4] = {1,2,4,3};         /* vettore elementi per l'iniziali */
	int i;
    /* prima prova di stampa : lista vuota */
    printf("Prova : Lista vuota?\n");
    print(ll);


    printf("Prova : Inserzioni \n");
    /* creo il primo nodo */
    ll = new_node(v[0]);

    /* creo e inserisco gli altri nodi */
        for (i=1; i< 4; i++){
			node = new_node(v[i]);
			insert(ll,node);
			print(ll);
        }
        printf("Prova : Map!!\nMAP piusei : ");

            vv = map(add_six,ll);
            print(vv);
            tt = map(square,ll);
            printf("MAP quadrato : ");
            print(tt);
            printf("Prova : Reduce\n");
            printf("piu ll = %d\n",reduce(add,0,ll));
            printf("per ll = %d\n",reduce(mul,1,ll));
            /* DDD */

            printf("Prova : Estrazione\n");
            /* elimino tutti gli elementi della lista ll */
            del_list(ll);
            /* la lista ora e' vuota */
            //ll = NULL;

            print(ll);

            return 0;





}



